-- key1：coupon:code:exchange:mark
-- key2：coupon:code:maxId
-- key3：cache:coupon:
-- key4：cache:user:couponCount:
-- arg1：serialNum
-- arg2:serialNum+1000
-- arg3：userId

-- 查询兑换码是否已经被兑换
if redis.call('getbit',KEYS[1],ARGV[1]) == 1 then
    return "1"
end

-- 根据兑换码获取优惠券id
local couponIdSet = redis.call('ZRANGEBYSCORE',KEYS[2],ARGV[1],ARGV[2],'limit',0,1)
if (#couponIdSet==0) then -- 不存在
    return "2"
end

-- 获取优惠券id
local couponId = couponIdSet[1]
-- 判断优惠券是否过期
local cacheCouponInfoKey = KEYS[3]..couponId
if redis.call('EXISTS',cacheCouponInfoKey) == 0 then
    return "3"
end
if tonumber(redis.call('HGET',cacheCouponInfoKey,'issueEndTime'))<tonumber(redis.call('time')[1]) then
    return "4" -- 过期
end

-- 校验每人限领数量
local  cacheCouponUserCountKey = KEYS[4]..couponId
if redis.call('HINCRBY', cacheCouponUserCountKey, ARGV[3],1) >
        tonumber(redis.call('HGET',cacheCouponInfoKey,'userLimit')) then
    -- 修改当前用户领取优惠券的数量
    redis.call('HINCRBY',cacheCouponUserCountKey,ARGV[3],-1)
     return "5" -- 超出限领数量
end
-- 修改当前兑换码状态
redis.call('setbit',KEYS[1],ARGV[1],1)

-- 库存-1
redis.call('HINCRBY',cacheCouponInfoKey,'totalNum',-1)
return tostring(couponId)